// console.log('ok -1010');
// let state: number = 1
// console.log(state);

let arr1: number[] = [1, 2]
// let arr2: Array<number> = [1, 2]


// --- |  竖线表示   联合类型---
// 加小括号 表示数组中可以存在 数字和字符串
let arr3: (number | string)[] = [1, 'haode', '2']
// 不加小括号表示只能存在两种类型中的一种
let arr4: number | string[] = ['haode', '2']


// ---类型别名---
type CustomA = (number | string)[]
let arr5: CustomA = [1, 'haode', '2']

// ---函数类型---   实际是指 参数和返回值的类型
function add(num1: number, num2: number): number {
    return num1 + num2
}

let add1 = (num1: number, num2: number): number => {
    return num1 + num2
}

// ---oid 类型---，函数可以不返回  实际上void表示返回的是null 或者 undefind
let greet = (name: string): void => {
    console.log('hello:', name);
}
// ---可选参数 ---
// (start: number, end?: number)  可选在后 ---可以
// (start?: number, end: number)  可选在前 ---不可以
let greet1 = (start?: number, end?: number): void => {
    console.log('开始：', start, '结束：', end);
}
// greet1()
// greet1(1)
// greet1(1, 2)


//  ---对象类型---
let person: { name: string; age: number; sayHi(): void; greet(name: string): void } = {
    name: 'jack',
    age: 19,
    sayHi() { },
    greet(name) { }
}
// ---对象中的可选属性和方法---
function myRequest(config: { url: string; method?: string }) {
    console.log(config);
}

// ---接口---  作用描述对象类型 达到复用的目的
interface IPerson {
    name: string; age: number; sayHi(): void; greet(name: string): void
}
let person1: IPerson = {
    name: 'zs',
    age: 18,
    sayHi() { },
    greet(name) { }
}

// 注意 ----  接口 和 类型别名
// 都可以给对象指定类型  ；但是 类型别名 可以为任意类型指定别名
type NumStr = number | string

// ---继承 extends---
interface point2D { x: number; y: number }
interface point3D extends point2D { z: number }

let pointx: point3D = {
    x: 1,
    y: 2,
    z: 3
}

// ---元组---
let position1: number[] = [23, 11]   // 不严谨 可以出现任意多个数字 
let position2: [number, number] = [23, 11] // 严谨 明确多少数据 指定位置 指定类型


// ---类型推论---
// 初始化赋值时，会推论出改字段的类型
let age = 18  // age 这里就被自动推论出类型是number
function countdata(num1: number, num2: number) {
    return num1 + num2
}     //countdata 推断出返回值是number类型


// ---字面量类型---
function changeDirection(direction1: 'up' | 'down' | 'left' | 'left') {
    console.log(direction1);
}
// 参数direction的值只能是 4个中的一个
// 优势 相比于string 类型 使用字面量 更加精确 严谨

// ---枚举 enum---
enum DirData { Up = 12, Left = 16, Down, Right }
function changeDirection1(direction: DirData) {
    console.log(direction);
}
changeDirection1(DirData.Up)

// ---any---  不推荐使用any 会失去ts的保护
let obj: any = { x: 0 }
// 两种隐式转换 不给值 也不加类型
let a
function adde(num1, num2) { }


// ---typeof---
// js中获取数据的类型  ts中获取 上下文中的变量或属性的类型
let p = { x: 1, y: 2 }
function formatPoint1(point: { x: number; y: number }) { }
function formatPoint2(point: typeof p) { }
